Keepalived权威指南中文(Keepalived:The Definitive Guide)

您所在的位置:网站首页 keep stopping翻译 Keepalived权威指南中文(Keepalived:The Definitive Guide)

Keepalived权威指南中文(Keepalived:The Definitive Guide)

2023-09-22 02:43| 来源: 网络整理| 查看: 265

Keepalived 权威指南 The Definitive Guide 第一章 VRRP1.1 VRRP协议简介VRRP路由器VRRP虚拟路由器MASTER和BACKUP 1.2 工作机制 第二章 KEEPALIVED2.1 Keepalived的设计和实现2.1.1 多进程模式2.1.2 控制面板2.1.3 WatchDog2.1.4 IPVS封装 2. 2 KeepAlived的安装2.3 KeepAlived配置详解2.3.1 全局配置全局定义静态地址和路由 2.3.2 VRRPD配置VRRP Sync Groups(s)VRRP实例(instance) 配置 2.3.3 LVS配置虚拟主机组虚拟主机 第三章 应用实例3.1 用Keepalived做HA3.1.1 HA Proxy和web服务器配置3.1.2 Keepalived配置不抢占安装MASTER的配置BACKUP的配置启动服务 3.2 用Keepalived配置LVS安装MASTER和BACKUP配置 参考文献 注:文中使用的Keepalived版本为1.1.15

作者:Final BSD(KEVIN KUANG) 二〇〇九年三月 www.sanotes.net

Kevin Kuang拥有版权@2009以及本书所有的发行版本。保留所有权利。 这份文档是免费的; 在自由软件组织颁布的GNU通用出版许可证的条款下,你可以再版或者修改它。许可证可以是第二版,或者任何后继版本(随你意)。

第一章 VRRP

Keepalived是VRRP的完美实现, 因此在介绍Keepalived之前, 我们有必要先了解VRRP的原理。了解VRRP最好的文档莫过于VRRP的RFC文档(是RFC 3768而不是2338, 如果你喜欢古董, 就看2338吧)。

1.1 VRRP协议简介

在现实的网络环境中(比如Internet) , 两台需要通信的主机(end-host) 大多数情况下并没有直接的物理连接。对于这样的情况,它们之间的路由怎么选择?主机如何选定到达目的主机的下一跳路由,这是一个问题。通常的解决办法有两种:

在主机上使用动态路由协议(比如RIP, OSPF等)在主机上配置静态路由 很明显,在主机上配置动态路由协议是非常不切实际的,因为管理、维护成本以及是否支持等诸多问题。那么配置静态路由就变得十分的流行。实际上,这种方式我们至今一直在用。但是,路由器(或者说默认网关default gateway) 却经常成为单点。就算配置了多个静态路由, 却因为必须重启网络才能生效而变得不实用。 VRRP的目的就是为了解决静态路由单点故障问题! VRRP通过一种竞选(election) 协议来动态的将路由任务交给LAN中虚拟路由器中的某台VRRP路由器。这里看起来很绕, 因为有两个关键名词:虚拟路由器和VRRP路由器。 VRRP路由器

VRRP路由器就是一台路由器, 只不过上面运行了VRRP D这样的程序来实现VRRP协议而已, 这是物理的路由器。一台VRRP路由器可以位于多个虚拟路由器。

VRRP虚拟路由器

所谓虚拟,就是说并不是实际存在的,是一个逻辑而不是物理的路由器。虚拟路由器通常由多台(物理的) VRRP路由器通过某种方式组成, 就好比这些物理的路由器都丢到一个池(pool) 里面去, 整个pool对外看起来就象是一台路由器, 但其实内部有多台。虚拟路由器的标识称为V RID。

MASTER和BACKUP

在一个VRRP虚拟路由器中, 有多台物理的VRRP路由器, 但是这多台物理的机器并不同时工作, 而是由一台称为MASTER的负责路由工作, 其他的都是BACKUP, MASTER并非一成不变, VRRP协议让每个VRRP路由器参与竞选, 最终获胜的就是MASTER.MASTER有一些特权, 比如拥有虚拟路由器的IP地址,我们的主机就是用这个IP地址作为静态路由的。拥有特权的MASTER要负责转发发送给网关地址的包和响应ARP请求。

1.2 工作机制

VRRP通过竞选协议来实现虚拟路由器的功能, 所有的协议报文都是通过IP多播(multicast) 包(多播地址224.0.0.18) 形式发送的。虚拟路由器由VRID(范围0-255) 和一组IP地址组成, 对外表现为一个周知的MAC地址:00-00-5E-00-01-(VRID) (这就是为什么后面的配置virtual_router_id为什么只能是0…255)。所以, 在一个虚拟路由器中, 不管谁是MASTER, 对外都是相同的MAC和IP(称之为VIP) 。客户端主机并不需要因为MASTER的改变而修改自己的路由配置, 对他们来说, 这种主从的切换是透明的。 在一个虚拟路由器中, 只有作为MASTER的VRRP路由器会一直发送VRRP广告包(VRRP Advertisement message) ,BACKUP不会抢占MASTER,除非它的优先级(priority) 更高。当MASTER不可用时(BACKUP收不到广告包) , 多台BACKUP中优先级最高的这台会被抢占为MASTER(这也说明了为什么需要state, 有需要priority这样的配置)。这种抢占是非常快速的( 192.168.1.1/24brd+deveth 0 scope global ... } static_routes { src$SRC_IP to$DST_IP dev$SRC_DEVICE ... src$SRC_IP to$DST_IP via$GW dev$SRC_DEVICE }

每一行设置一个IP, 这些配置都是Linux下ip这个命令的参数, 比如上面的192.168.1.1/24brd+dev ethos cope global, keepalived最终会 直接使用ipaddr add 192.168.1.1/24brd+deveth 0 scope global来添加, 所以这里的配置都要合ip命令的规则。这就是全局配置段的全部。

2.3.2 VRRPD配置

VRRPD的配置也包括2部分:VRRP同步组(synchro ization group) 和VRRP实例(VRRP Instance) 。

VRRP Sync Groups(s)

不使用Sync Group的话, 如果机器(或者说router) 有两个网段, 一个内网一个外网, 每个网段开启一个VRRP实例, 假设VRRP配置为检查内网, 那么当外网出现问题时, VRRPD认为自己仍然健康, 那么不会发送Master和Backup的切换, 从而导致了问题。Sync group就是为了解决这个问题,可以把两个实例都放进一个Sync Group, 这样的话, group里面任何一个实例出现问题都会发生切换。

vrrp_sync_group VG_1 { group { inside_network #这里是实例名(比如VI_1) outside_network ... } notify_master /path/to/to_master.sh notify_backup /path_to/to_backup.sh notify_fault "/path/fault.sh VG_1" notify /path/to/notify.sh smtp_alert } notify_master指定当切换到Master时, 执行的脚本, 这个脚本可以传入参数(引号引起),其他2个类推。notify指令有3个参数, 这些参数由keepalived提供:$1(GROUP—INSTANCE) ,$2(group或者instance的名字) , $3(MASTER-BACKUP—FAULT)smtp_alter使用global_defs里面定义的邮件地址和smtp服务器在切换后发送邮件通知。 VRRP实例(instance) 配置

VRRP实例就表示在上面开启了VRRP协议, 这个实例说明了VRRP的一些特性, 比如主从、V RID等等, 可以在每个interface上开启一个实例。VRRP实例配置主要定义vrrp-sync-group里面的每个组的漂移IP等。

vrrp_instance inside_network { state MASTER interface eth0 dont_track_primary track_interface { eth0 eth1 } mcast_src_ip garp_master_delay 10 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS autp-pass 1234 } virtual_ipaddress { #/brddevscopelabel 192.168.200.17/24 dev eth1 192.168.200.18/24 dev eth2 label eth2:1 } virtual_routes { #src[to] /via lgwdevscope src 192.168.100. 1 to 192.168.109.0/24 via 192.168.200.254 dev eth1 192.168.110.0/24 via 192.168.200.254 dev eth1 192.168.111.0/24 dev eth2 192.168.112.0/24 via 192.168.100. 254 } nopreempt preemtp_delay 300 debug } state state指定instance的初始(Initial) 状态, 在两台router都启动后, 马上会发生竞选,高priority的会竞选为Master, 所以这里的state并不表示这台就一直是Master。interface inside_network实例绑定的网卡dont_track_primary忽略VRRP的interface错误(默认不设置) -track_interface设置额外的监控, 里面的任意一个网卡出现问题, 都会进入FAULT状态 -mcast_src_ip发送多播包的地址, 如果不设置, 默认使用绑定的网卡的primary IP。garp_master_delay在切换到MASTER状态后, 延迟进行gratuitous ARP请求virtual_router_id VRID标记(0…255)priority 100高优先级竞选为MASTER, MASTER要高于BACKUP至少50advert_int检查间隔, 默认1svirtual_ipaddress里面指定漂移地址(VIP) , 也就是切换到MASTER时,这些IP会被添加, 切换到BACKUP时, 这些IP被删除(传给ip addr命令),所以每台服务器上可以不绑定任何虚拟地址,而都把他们放virtual ipaddress里面(可以多个) , keepalived会自动使用ip addr进行绑定(不需要以来ifcfg-eth0) , ip add可以看到virtual_routes和virtual_ipaddress一样, 发生切换时添加/删除路由lvs_sync_daemon_interface lvs syncd绑定的网卡authentication这一段设置认证auth_type认证方式,支持PASS和AHauth_pass认证的密码nopreempt设置为不抢占, 注意这个配置只能设置在state为BACKUP的主机上, 而且这个主机的priority必须比另外一台高preempt_delay抢占延迟, 默认5分钟debug Debug级别notify_master和sync group里面的配置一样。 2.3.3 LVS配置

LVS的配置也包括2部分:虚拟主机组(virtual server group) 和虚拟主机(virtual server) 。这些配置都会传递给ipvsadm作为参数。

虚拟主机组

这个配置段是可选的, 目的是为了让一台RealServer上的某个service可以属于多个Virtual Server,并且只做一次健康检查。

virtual_server_group { #VIP port fw mark } 虚拟主机

virtual_server可以以下面3种方式中的任意一种配置:

virtual_server IP portvirtual_server fwmark intvirtual_server group string 如下例: virtual_server 192.168.1.280 { #设置一个virtual server:VIP:Vport delay_loop 3 #service polling的delay时间 lb_algo rrl|wrr|lc|wlc|lblc|sh|dh #LVS的调度算法 lb_kind NAT|DR|TUN #LVS集群模式 persistence_timeout 120 #会话保持时间(秒) persistence_granularity #LVS会话保持粒度, ipvsadm中的-M参数, 默认是Ox ffff ffff, 即根据每个客户端做会话保持。 protocol TCP #使用的协议是TCP还是UDP ha_suspend #suspend health checker's activity virtualhost #HTTP_GET做健康检查时,检查的Web服务器的虚拟主机(即Host:头) sorry_server #备用机, 所有的realserver失效后启用 real_server { #每台RealServer都需要一个下面的配置项 weight 1 #默认为1,0为失效 inhibit_on_failure #在服务器健康检查失败时, 将其weight设置为0, 而不是直接从IPVS里面删除 notify_up 丨 #在检测到service up后执行的脚本 notify_down丨 #在检测到service down后执行的脚本 #下面配置任意一种健康检查方式:HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK HTTP_GET | SSL_GET { url { #HTTP/SSL检查的URL, 这里可以指定多个URL path/ digest #SSL检查后的摘要信息(genhash工具算出) status_code 200 #HTTP检查的返回状态码 } connect_port 80 #健康检查端口 #以此地址发送请求对服务器进行健康检查 bind to connect_timeout #连接超时时间 nb_get_retry 3 #重连次数 delay_before_retry 2 #重连间隔时间(秒) } #END OF HTTP_GET|SSL_GET #TCP方式的健康检查 TCP_CHECK { connect_port 80 bind to 192.168.1. 1 connect_timeout 4 } #END OF TCP_CHECK #SMTP方式健康检查 SMTP_CHECK { #这里的配置意义和HTTP里面的类似 host { connect_ip connect_port #默认检查25端口 bind to } connect_timeout retry delay_before_retry #"smtp HELO"请求命令的参数, 可选的。 helo_name | } #END OF SMTP_CHECK #MISC健康检查方式, 执行一个程序 MISC_CHECK { #外部程序或脚本路径 misc_path | #脚本执行的超时时间 misc_timeout #如果设置了misc_dynamic的话,的退出状态码会用来动态调整服务器的权重(weight) . #返回0:健康检查OK,权重不被修改health checker程序 #返回1:健康检查失败,权重设为0 #返回2-255:健康检查OK,权重设置为:退出状态码-2,比如返回255, 那么weight=255-2=253 misc_dynamic } #END OF MISC_CHECK } #END OF Realserver } #END OF Virtual Server 第三章 应用实例

本章主要介绍两种Keepalived的使用, 一种仅使用Keepalived做HA, 一种既做HA又用来配置LVS。

3.1 用Keepalived做HA

用Keepalived做HA是如此的简单, 我们所有的精力都在配置Keepalived的VRRP子进程上, 而完全可以不管LVS的配置。这节我们假设给两台运行HAProxy的机器做HA, 提供VIP。架构如下: keepalived for Haproxy 1

3.1.1 HA Proxy和web服务器配置

这部分不属于本文讨论范围内, 我们只关注在ha proxy的机器上的Keepalived相关配置。

3.1.2 Keepalived配置

假设haporxy和后端的web服务器都准备好了, 现在就可以开始配置Keepalived了。这种情况下, 因为我们只用到Keepalived的HA, 即做virtual router的功能, 所以只需要完成第二章里面描述的全局和VRRP配置即可。 配置前需要准备的信息为:

VRID–我们使用默认的51VIP一上图的192.168.1.1, VIP也即Keepalived里面的v ritual address的ip地址LB的IP这里就是两台ha proxy的地址(192.168.1.3和1.4, 并假设前者为MASTER)优先级-priority, 在多个BACKUP竞选MASTER的时候, 优先级高会获选。这里假设192.168.1.3的优先级为150,另外一台为100

所以,实际要配置为: keepalived for Haproxy 2

不抢占

当MASTER出现问题后, BACKUP会竞选为新的MASTER, 那么当之前的MASTER重新ONLINE后, 是继续成为MASTER还是变成BACKUP呢?默认情况下, 如果没设置不抢占, 那么之前的MASTER起来后会继续抢占成为MASTER, 也就是说,整个过程需要发生2次切换:

MASTER->BACKUPBACKUP->MASTER 这样对业务频繁的切换是不能容忍的, 因此我们希望MASTER起来后,成为BACKUP!所以要设置不抢占。Keepalived里面提供了nopreempt这个配置, 但是这个配置只能用在state为BACKUP的机器上, 但是我们明明希望的是MASTER不进行抢占, 没办法, MASTER的state也得设置成BACKUP。也就是说192.168.1.3和192.168.1.4都要将state设置为BACKUP! 那么到底谁是MASTER?抢占吧, 通过priority, 所以我们在两台BACKUP上面通过设置不同的priority来让他们一起来就抢占, 高priority的192.168.1.3成为最初的MASTER。 安装

MASTER和BACKUP上的安装过程完全一样, 使用下面的命令(这里假设在RedHat Enterprise AS 4 Update 4上安装) :

$wgethttp://www.keepalived.org/software/keepalived-1.1.17.tar.gz $tar xzvf keepalived-1.1.17.tar.gz $cd keepalive d-1.1. 17 $./configure--prefix=/\ --mandir=/usr/local/share/man --with-kernel-dir=/usr/src/kernels/2.6.9-67.EL-smp-i 686/ $make #makeinstall #cp keepalived/etc/in it.d/keepalived.rh.init/etc/init.d/keepalived #chmod+x/etc/in it.d/keepalived #cp keepalived/etc/in it.d/keepalived.sysconfig/etc/sysconfig/keepalived #chkconfig--add keepalived #chkconfig--level 345 keepalived on MASTER的配置

MASTER的配置—192.168.1.3的配置

global_defs { notification_email { [email protected] } notification_email_fromfinalbsdogmail.com smtp_server 127.0.0. 1 smtp_connect_timeout 30 router_id ha proxy-ha } vrrp_sync_group VG1 { group { VI_1 } } vrrp_instance VI_1 { state BACKUP smtp_alert notify_fault "/root/script/notify_mail.sh fault" notify_master "/root/script/notify_mail.sh master" nopreempt interface eth1 track_interface { eth0 eth1 } virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass fsa f..7&f } virtual_ipaddress { 192.168.1.1/24deveth 1 scope global } } BACKUP的配置

BACKUP的配置—192.168.1.4的配置 BACKUP的配置和MASTER基本一样,但有2个不同点:

priority设置为100不设置no preempt 启动服务

分别在两台上执行service keepalived start启动服务。

3.2 用Keepalived配置LVS

我们假设下面的情形: 4台web服务器通过一对LVS进行调度, LVS转发模式为NAT。一对LVS通过Keepalived做HA, keepalived for LVS 在LVS中, 多了几个概念:

virtual server就是VIP+VPORT, VIP需要通过VRRP D配置段进行配置。real server这里LVS调度的web服务器的IP地址, 即图中的192.168.11—14lb_algo调度算法, 这里使用wlclb_kind包转发模式, 这里使用NATweight权重, 默认这里都设置为3 安装

安装和上一节3.1.2讲的安装完全一样,这里不再赘述。

MASTER和BACKUP配置

Keepalived的全局和vrrp配置段和前一节3.1.2完全一样, 这里我们只需 要添加virtual_server配置段:

virtual_server 192.168.1.180 { delay_loop 3 lb_algo wlc lb_kind DR persistence_timeout 1200 protocol TCP ha_suspend real_server 192.168.1.1180 { weight 3 TCP_CHECK { connect_timeout 3 } } real_server 192.168.1.1280 { weight 3 TCP_CHECK { connect_timeout 3 } } } 参考文献

[1] RFC 3768―Virtual Router Redundancy Protocol(VRRP) [2] man 5 keepalived.conf [3] man 8 keepalived [4] www.keepalived.org [5] keepalived源代码



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3